#! /usr/bin/python
#                   _ooOoo_                     
#                  o8888888o                    
#                  88" . "88                    
#                  (| -_- |)                    
#                  O\  =  /O                    
#               ____/`---'\____                 
#             .'  \\|     |//  `.               
#            /  \\|||  :  |||//  \              
#           /  _||||| -:- |||||-  \             
#           |   | \\\  -  /// |   |             
#           | \_|  \---/  |   |             
#           \  .-\__  `-`  ___/-. /             
#         ___`. .'  /--.--\  `. . __            
#      ."" '<  `.___\_<|>_/___.'  >'"".      
#     | | :  `- \`.;`\ _ /`;.`/ - ` : | |       
#     \  \ `-.   \_ __\ /__ _/   .-` /  /       
#======`-.____`-.___\_____/___.-`____.-'======  
#                   `=---='                     
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
#         Buddha bless me for no bug            
#                                               
####################################################################################
#   Filename    :  var.py                                                      
#   Author      :  Shawn Tan                                                        
#   Date        :  2017.2.22                                                        
#   Description :                                                                   
#   History     :  2017.2.22             creat the document            Shawn Tan    
####################################################################################
import json

__author__ = "ST-CAT"

#################################################################################
#                           runsim Keyword 
#################################################################################

attribute_keyword={
#name                    #validity 
'category'               :  True,
'git_cfg'                :  True,
'drm'                    :  True,
'max_runs_in_parallel'   :  True,
'run_num'                :  True,
'top_dir'                :  True,
'comp_dir'               :  True,
'sim_dir'                :  True,
'test_name'              :  True,
'timescale'              :  True,
'define_opt'             :  True,
'c_test_name'            :  True,
'comp_opt'               :  True,
'tb_comp_opt'            :  True,
'rtl_comp_opt'           :  True,
'vip_comp_opt'           :  True,
'vip_file_list'          :  True,
'rtl_file_list'          :  True,
'tb_file_list'           :  True,
'c_files'                :  True,
'tb_top'                 :  True,
'elab_opt'               :  True,
'seed'                   :  True,
'waveform'               :  True,
'verbosity'              :  True,
'timeout'                :  True,
'sim_args'               :  True,
'uvm_testname'           :  True,
'run_script'             :  True,
'pre_run_script'         :  True,
'post_run_script'        :  True,
'post_simulation_script' :  True,
'pre_group_script'       :  True,
'post_group_script'      :  True,
'pass_cfg'               :  True,
'fail_cfg'               :  True,
'ignore_cfg'             :  True,
'pre_session_script'     :  True,
'post_session_script'    :  True,
'session_description'    :  True,
'scan_script'            :  True
}

attribute_type={
#name                    # attribute
'category'               :  'CONTROL',
'git_cfg'                :  'CONTROL',
'drm'                    :  'CONTROL',
'max_runs_in_parallel'   :  'CONTROL',
'run_num'                :  'CONTROL',
'top_dir'                :  'DIR',
'comp_dir'               :  'DIR',
'sim_dir'                :  'DIR',
'timescale'              :  'COMPILE',
'define_opt'             :  'COMPILE',
'c_test_name'            :  'COMPILE',
'comp_opt'               :  'COMPILE',
'rtl_comp_opt'           :  'COMPILE',
'tb_comp_opt'            :  'COMPILE',
'vip_comp_opt'           :  'COMPILE',
'vip_file_list'          :  'COMPILE',
'rtl_file_list'          :  'COMPILE',
'tb_file_list'           :  'COMPILE',
'c_files'                :  'ELABORATION',
'tb_top'                 :  'ELABORATION',
'elab_opt'               :  'ELABORATION',
'seed'                   :  'SIMULATION',
'waveform'               :  'SIMULATION',
'verbosity'              :  'SIMULATION',
'sim_args'               :  'SIMULATION',
'uvm_testname'           :  'SIMULATION',
'run_script'             :  'SCRIPT',
'pre_run_script'         :  'SCRIPT',
'post_run_script'        :  'SCRIPT',
'post_simulation_script' :  'SCRIPT',
'pre_group_script'       :  'SCRIPT',
'post_group_script'      :  'SCRIPT',
'pass_cfg'               :  'SCRIPT',
'fail_cfg'               :  'SCRIPT',
'ignore_cfg'             :  'SCRIPT',
'pre_session_script'     :  'SCRIPT',
'post_session_script'    :  'SCRIPT',
'session_description'    :  'SCRIPT',
'scan_script'            :  'SCRIPT' 
}

add_options={
# name                      #validity
'category'               :  True,
'git_cfg'                :  False,
'drm'                    :  False,
'max_runs_in_parallel'   :  False,
'run_num'                :  False,
'top_dir'                :  False,
'comp_dir'               :  False,
'sim_dir'                :  False,
'timescale'              :  False,
'define_opt'             :  True,
'c_test_name'            :  False,
'comp_opt'               :  True,
'rtl_comp_opt'           :  True,
'tb_comp_opt'            :  True,
'vip_comp_opt'           :  True,
'vip_file_list'          :  True,
'rtl_file_list'          :  False,
'tb_file_list'           :  False,
'c_files'                :  False,
'tb_top'                 :  True,
'elab_opt'               :  True,
'seed'                   :  False,
'waveform'               :  False,
'verbosity'              :  False,
'sim_args'               :  True,
'uvm_testname'           :  False,
'run_script'             :  False,
'pre_run_script'         :  False,
'post_run_script'        :  False,
'post_simulation_script' :  False,
'pre_group_script'       :  False,
'post_group_script'      :  False,
'pass_cfg'               :  True,
'fail_cfg'               :  True,
'ignore_cfg'             :  True,
'pre_session_script'     :  False,
'post_session_script'    :  False,
'session_description'    :  False,
'scan_script'            :  False    
}

attribute_decorate = {
#name                    #validity 
'category'               :  False,
'git_cfg'                :  False,
'drm'                    :  False,
'max_runs_in_parallel'   :  False,
'run_num'                :  False,
'top_dir'                :  False,
'comp_dir'               :  False,
'sim_dir'                :  False,
'test_name'              :  True,
'timescale'              :  True,
'define_opt'             :  False,
'c_test_name'            :  False,
'comp_opt'               :  False,
'tb_comp_opt'            :  False,
'rtl_comp_opt'           :  False,
'vip_comp_opt'           :  False,
'vip_file_list'          :  False,
'rtl_file_list'          :  False,
'tb_file_list'           :  False,
'c_files'                :  False,
'tb_top'                 :  False,
'elab_opt'               :  False,
'seed'                   :  False,
'waveform'               :  False,
'verbosity'              :  False,
'timeout'                :  False,
'sim_args'               :  False,
'uvm_testname'           :  False,
'run_script'             :  False,
'pre_run_script'         :  False,
'post_run_script'        :  False,
'post_simulation_script' :  False,
'pre_group_script'       :  False,
'post_group_script'      :  False,
'pass_cfg'               :  False,
'fail_cfg'               :  False,
'ignore_cfg'             :  False,
'pre_session_script'     :  False,
'post_session_script'    :  False,
'session_description'    :  False,
'scan_script'            :  False
}

##############################################################################
#                        Class Declaration
##############################################################################

class REGRESSION: pass
class SESSION: pass
class GROUP: pass
class TEST: pass
class ATTRIBUTE: pass
class TESTCASE: pass
class STATUS: pass
class SIMULATION: pass
###############################################################################

###############################################################################
#                        Operation Group
###############################################################################

optype_list = [
  'CONTROL',
  'DIR',
  'COMPILE',
  'COMPILE_RTL',
  'ELABORATION',
  'SIMULATION',
  'SCRIPT'
]

class TestEncoder(json.JSONEncoder):
  '''testcase object transfer to JSON'''

  def default(self, obj):
    d = {}
    d.update(obj.__dict__)
    return d

attr_cmdline_map_dict = {
'CATEGORY'              :  'category',               
'DRM'                   :  'drm',                    
'ParallelNum'           :  'max_runs_in_parallel',   
'RunNum'                :  'run_num',                
'ReDir'                 :  'top_dir',                
'Compile_Dir'           :  'comp_dir',               
'Sim_Dir'               :  'sim_dir',                
'COMP_OPT'              :  'comp_opt',               
'COMP_TB_OPT'           :  'tb_comp_opt',            
'COMP_RTL_OPT'          :  'rtl_comp_opt',           
'COMP_VIP_OPT'          :  'vip_comp_opt',           
'VIPFILE'               :  'vip_file_list',          
'RTLFILE'               :  'rtl_file_list',          
'TBFILE'                :  'tb_file_list',           
'CFILE'                 :  'c_files',                
'ELAB_OPT'              :  'elab_opt',               
#'SEED'                  :  'seed',                   
'Verbosity'             :  'verbosity',              
'SIMARGS_PLUS'          :  'sim_args',               
'SIMARGS'               :  'sim_args',               
'RUN_SCRIPT'            :  'run_script',             
'PRE_RUN_SCRIPT'        :  'pre_run_script',         
'POST_RUN_SCRIPT'       :  'post_run_script',        
'POST_GROUP_SCRIPT'     :  'post_simulation_script', 
'PRE_GROUP_SCRIPT'      :  'pre_group_script',       
'POST_GROUP_SCRIPT'     :  'post_group_script',      
'PASS_CFG'              :  'pass_cfg',               
'FAIL_CFG'              :  'fail_cfg',               
'IGNORE_CFG'            :  'ignore_cfg',             
'PRE_SESSION_SCRIPT'    :  'pre_session_script',     
'POST_SESSION_SCRIPT'   :  'post_session_script',    
'SCAN_SCRIPT'           :  'scan_script'            
}

cmd_line_plus = [
'SIMARGS_PLUS'
]

attr_default_dict = { 
'max_runs_in_parallel'   : {'parallel_local' : 5, 'serial_local' : 1, 'lsf' : 5},
'drm'                    : 'lsf',
'top_dir'                : 'build'
}

attr_relation_dict = {
'max_runs_in_parallel'   : 'drm'
}

attr_only_in_test = [
'category', 
'uvm_testname',
'seed',
'sim_dir'
]

attr_not_in_test = [
'git_cfg',
'top_dir',
'comp_dir',
'timescale',
'comp_opt',
'tb_comp_opt',  
'rtl_comp_opt', 
'vip_comp_opt', 
'vip_file_list',
'rtl_file_list',
'tb_file_list', 
'c_files',      
'tb_top',       
'elab_opt',     
'pre_group_script',
'post_group_script',
'pre_session_script',
'post_session_script',
'session_description'
]

